package com.cskaoyan.javase.array._1use._1initialization;

/**
 * 数组的初始化
 * 声明完成一个数组后，该数组仍然不能使用，还缺少一个初始化（initialization）的过程，类似变量初始化（赋值）
 *
 * 对于变量而言，初始化是在内存中开辟空间并赋值的过程，对于数组而言，也是类似的过程。
 * 数组要开辟一片连续的空间用来存放数据，然后进行元素赋值，即：
 *          1.我们要告诉需要开辟多少内存空间（数组有多长）
 *          2.数组中的元素要明确它的值（没有值，数组的存储单元也没有意义）
 *
 * 于是(一维)数组的初始化,同样要分成两种方式:
 *      1.静态初始化: 指的是由程序员显式的，指定数组中每个元素的初始值，数组的长度由系统决定（实际上也是由程序员给出的）
 *      和数组的声明写在一起，语法格式就是：
 *      数据类型[] 数组名 = new 数据类型[]{元素1,元素2,元素3...};
 *      静态初始化有简写的形式，可以省略new关键字，如下：
 *          数据类型[] 数组名 = {元素1,元素2,元素3...};
 *      注：简化的形式必须跟在声明之后，不能单独使用！ 下列写法就是错误的：
 *          数组名 = {元素1,元素2,元素3...};
 *
 *
 *      2.动态初始化: 指的是明确指出数组长度的一种初始化数组的方式
 *          语法:
 *          数据类型[] 数组名 = new 数据类型[数组长度];
 *          注意: 数组的长度是一个>=0的整数,最大值是int类型最大值
 *              取负数,会运行报错
 *              取超过int的数值,无法通过编译的
 *          动态初始化只给出数组的长度,那么数组元素的取值是什么呢?
 *          数组中的元素具有默认值,这个默认值是由JVM给出的。
 *
 *      以上，就是数组的两种初始化方式，（一维）数组没有第三种初始化的方式，比如：
 *      静态初始化和动态初始化叠加使用，是经典的错误.
 *
 *
 * 数组的初始化,实际上是开辟数组存储内存空间,给数组元素赋值,
 * 那么这里开辟的内存空间是谁的内存空间呢?
 * JVM的内存空间
 *
 * @since 10:12
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        // 静态初始化一个长度为0的int数组,不装任何元素
        int[] arr = new int[]{};
        // 静态初始化一个长度为3,元素取值分别是1,2,3的int数组
        int[] arr2 = new int[]{1, 2, 3};
        // 静态初始化简写形式
        String[] arr3 = {"abc", "123", "hello world!"};
        // 静态初始化的简写形式必须和声明写在一起
        // arr3 = {};
        arr3 = new String[]{"666"};

        // 动态初始化一个double数组
        double[] arr4 = new double[3];
        System.out.println(arr4);

        // "动静结合"是不行的
        // int[] arr5 = new int[3]{1,2,3};
    }
}
